home *** CD-ROM | disk | FTP | other *** search
/ Practical Algorithms for Image Analysis / Practical Algorithms for Image Analysis.iso / TARFILE.GZ / tarfile / ch_6.2 / xvora / vora_io.c < prev    next >
Encoding:
C/C++ Source or Header  |  1999-09-11  |  5.4 KB  |  208 lines

  1. /*
  2.  * VOR(onoi)A(nalysis)_IO
  3.  *
  4.  * i/o routines for Voronoi analysis
  5.  * 
  6.  */
  7. #include <stdlib.h>
  8. #include <stdio.h>
  9. #include "vora.h"
  10.  
  11. #define    OFF        0
  12. #define    ON        1
  13.  
  14. /* globals */
  15. extern int P_STATS;
  16. extern int Q_STATS;
  17. extern int SAVE_DATA;
  18. extern char *HIST_HEADER;
  19.  
  20. /*
  21.  * write histogram data to output file of type .hdt
  22.  */
  23. void
  24. write_hdt_data (fpOut, np, foo, h, ds, nd)
  25.      FILE *fpOut;
  26.      int np, nd;
  27.      float *foo;
  28.      struct Histo *h;
  29.      struct Tuple *ds;
  30. {
  31.   int i;
  32.  
  33.   fprintf (fpOut, "%d\n", h->nb, np);
  34.  
  35.   for (i = 0; i < np; i++)
  36.     fprintf (fpOut, "%f\n", *(foo + i));
  37.  
  38.   for (i = 0; i < h->nb; i++)
  39.     fprintf (fpOut, "%f %f\n", (float) i, h->ph[i]);
  40.  
  41. /* 
  42.  * following entries (histogram parms) not read by fitting routine 
  43.  */
  44.   fprintf (fpOut, "%s\n", HIST_HEADER);
  45.   fprintf (fpOut, "    no objects: %d\n", h->nh);
  46.   fprintf (fpOut, "          mean: %lf\n", h->mean);
  47.   fprintf (fpOut, "       std_dev: %lf\n", h->sdev);
  48.   fprintf (fpOut, "     bin_width: %f\n", h->bw);
  49.   fprintf (fpOut, "           min: %f, max: %f\n", h->amin, h->amax);
  50.  
  51. /*
  52.  * P - and Q - functions
  53.  */
  54.   if ((P_STATS == ON) || (Q_STATS == ON)) {
  55.     if (P_STATS == ON)
  56.       fprintf (fpOut, "p-function\n");
  57.     if (Q_STATS == ON)
  58.       fprintf (fpOut, "q-function\n");
  59.     for (i = 0; i <= nd; i++)
  60.       fprintf (fpOut, "%f %f\n", (ds + i)->x, (ds + i)->y);
  61.   }
  62.  
  63.   if (SAVE_DATA == ON) {
  64.     fprintf (fpOut, "input data for %s\n", HIST_HEADER);
  65.     for (i = 0; i < h->nh; i++)
  66.       fprintf (fpOut, "%f %f\n", (float) i, h->phd[i]);
  67.   }
  68. }
  69.  
  70.  
  71. /*
  72.  * log site topol data in .std (for retrieval by xsgt.c)
  73.  */
  74. void
  75. log_st_data (FILE * fpOut, char *wbuf, int ns, struct vSite *s)
  76. {
  77.   int inn, is;
  78.  
  79.   gprintf (fpOut, "...log site topology data in file: %s\n", wbuf);
  80.   gprintf (fpOut, "...no records: %d\n", ns);
  81.   gprintf (fpOut, "\n\n");
  82.  
  83.   for (is = 0; is < ns; is++) {
  84.     gprintf (fpOut, "site: %3d; (%4.1f, %4.1f) -- ",
  85.              (s + is)->sitenbr, (s + is)->coord.x, (s + is)->coord.y);
  86.     gprintf (fpOut, "eFlag: %d, aoiFlag: %d; nnn: %2d\n",
  87.              (s + is)->eFlag, (s + is)->aoiFlag, (s + is)->nnn);
  88.     gprintf (fpOut, "...aVp: %u\n", (s + is)->v_area);
  89.     gprintf (fpOut, "...(nn site index: nn distance)\n");
  90.     for (inn = 0; inn < (s + is)->nnn; inn++) {
  91.       gprintf (fpOut, " (%3d: %4.1f)\n",
  92.                (s + is)->nnsi[inn], (s + is)->nnd[inn]);
  93.     }
  94.     gprintf (fpOut, "\n\n");
  95.   }
  96. }
  97.  
  98.  
  99. /*
  100.  * log polygon topol data in .ptd
  101.  */
  102. void
  103. log_pt_data (FILE * fpOut, char *wbuf, int ns, struct vPoly *p, struct vEdge *e, struct vSite *v, int CPV)
  104. {
  105.   int ie, is;
  106.   int e_vO, e_vF;
  107.   int iv, iflag = -1;
  108.  
  109.  
  110.   gprintf (fpOut, "...log poly topology data in file: %s\n", wbuf);
  111.   gprintf (fpOut, "...no records: %d\n", ns);
  112.   gprintf (fpOut, "\n\n");
  113.  
  114.   for (is = 0; is < ns; is++) {
  115.     gprintf (fpOut, "site: %3d; (%4.1f, %4.1f) -- ",
  116.              (p + is)->sitenbr, (p + is)->coord.x, (p + is)->coord.y);
  117.     gprintf (fpOut, "aoiF: %d, eFl: %d, lF: %d -- ",
  118.              (p + is)->aoiFlag, (p + is)->eFlag, (p + is)->aoiFlag);
  119.     gprintf (fpOut, "a: %6.1f; ne: %2d\n",
  120.              (p + is)->area, (p + is)->ne);
  121.  
  122.     gprintf (fpOut, "...(edge_ind, edge_len, edge_pt_coords):\n");
  123.     for (ie = 0; ie < (p + is)->ne; ie++) {
  124.       gprintf (fpOut, " (%5d, %5d) -- ",
  125.                (p + is)->pei[ie], (int) (p + is)->vel[ie]);
  126.  
  127.       e_vO = (e + ((p + is)->pei[ie]))->vO;
  128.       e_vF = (e + ((p + is)->pei[ie]))->vF;
  129.       if ((e_vO != -1) && (e_vF != -1)) {
  130.         gprintf (fpOut, " (%3d, %3d) <--> (%3d, %3d)\n",
  131.              F_TO_INT ((v + e_vO)->coord.x), F_TO_INT ((v + e_vO)->coord.y),
  132.             F_TO_INT ((v + e_vF)->coord.x), F_TO_INT ((v + e_vF)->coord.y));
  133.       }
  134.       else {
  135.         gprintf (fpOut, " edge crossed AOI bounds\n");
  136.       }
  137.     }
  138.  
  139.     if (CPV == 1) {
  140.       gprintf (fpOut, "...(vx, vy):\n");
  141.       for (ie = 0; ie < (p + is)->ne; ie++) {
  142.         if (((iv = (p + is)->pvi[ie]) >= 0) &&
  143. /* redundant ?? */ ((v + iv)->aoiFlag == UnSet)) {
  144.           gprintf (fpOut, " (%3d, %3d)",
  145.                    F_TO_INT ((v + iv)->coord.x),
  146.                    F_TO_INT ((v + iv)->coord.y));
  147.         }
  148.         else
  149.           gprintf (fpOut, " (%3d, %3d)", iflag, iflag);
  150.       }
  151.     }
  152.     gprintf (fpOut, "\n\n");
  153.   }
  154. }
  155.  
  156.  
  157.  
  158. /*
  159.  * dump polygon vertex coordinates to .ptd;
  160.  *
  161.  * for convenience, write ne_max+1 sets of tuples (x, y);
  162.  * for flaged sites, set coordinates to 0 
  163.  */
  164. void
  165. dump_poly_vc (FILE * fpOut, int ns, struct vPoly *p, struct vSite *v)
  166. {
  167.   int ie, is, iv;
  168.   int ne_max;
  169.   int null = 0;
  170.  
  171.   ne_max = 0;
  172.   for (is = 0; is < ns; is++) {
  173.     if (((p + is)->aoiFlag == UnSet) &&
  174.         ((p + is)->eFlag == UnSet) &&
  175.         ((p + is)->lFlag == UnSet)) {
  176.       if ((p + is)->ne > ne_max)
  177.         ne_max = (p + is)->ne;
  178.     }
  179.   }
  180.  
  181. /*
  182.  * write file line-by-line, process unflagged polygons only
  183.  */
  184.   for (is = 0; is < ns; is++) {
  185.     if (((p + is)->aoiFlag == UnSet) &&
  186.         ((p + is)->eFlag == UnSet) &&
  187.         ((p + is)->lFlag == UnSet)) {
  188.  
  189.       /* centroid */
  190.       gprintf (fpOut, " %3d %3d",
  191.                F_TO_INT ((p + is)->coord.x),
  192.                F_TO_INT ((p + is)->coord.y));
  193.  
  194.       /* polygon vertices */
  195.       for (ie = 0; ie < (p + is)->ne; ie++) {
  196.         iv = (p + is)->pvi[ie];
  197.         gprintf (fpOut, " %3d %3d",
  198.                  F_TO_INT ((v + iv)->coord.x),
  199.                  F_TO_INT ((v + iv)->coord.y));
  200.       }
  201.       for (ie = (p + is)->ne; ie < ne_max; ie++) {
  202.         gprintf (fpOut, " %3d %3d", null, null);
  203.       }
  204.       gprintf (fpOut, "\n");
  205.     }
  206.   }
  207. }
  208.